<?php
/**
 * Controller_Default
 *
 * Класс Controller_Default отвечает за обработку запросов к страницам, для которых первое слово сходу не определяет контроллер
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 2.0
 */
class Controller_Default extends Controller_Base {
	
	/**
	 * Выбираем действие исходя из URL
	 *
	 */
	public function action() {
	  Service_Debug::setDebug();
	  $this->showLeftColumn = false;
	  switch ($this->arrRequest[0]) {
	    case 'revision':
	    	$f = file(ABSPATH . '.svn/entries');
        echo 'Ревизия: ' . $f[3] . '<br />';
        $f[9] = strtotime($f[9]);
        echo 'Дата: ' . gmdate("d.m.y", $f[9] + 4 * 3600) . '<br />';
        echo 'Время: ' . gmdate("H:i:s", $f[9] + 4 * 3600) . '<br />';
        $arrRepo = explode('/', $f[4]);
        $branch = array_pop($arrRepo);
        echo 'Ветка: /' . $branch;
	      exit();
	      break;	
	    case 'db_test':
	      $objDB = Service_Database::instance();
	      $stmt = "SELECT * FROM table2 WHERE essence_type = 1";  
	      Pressure::setStart(); // Начинаем сбор данных о нагрузке страницы
	      for ($i = 0; $i < 1000; $i++) {
	        $objDB->select($stmt);
	      }
	      $duration = Pressure::calculateCurrentDuration();
	      echo '<pre>ID_TYPE ';
	      print_r($duration);
	      echo '</pre>';	
        exit();
	      break;		    	
	    default:
	  	  $categoryUrl = Service_Escape::absolutelyEscapeString($this->arrRequest[0]);
		  // Проверка на существование категории с таким url
	  	  $objCategory = new Category();
	      $objCategory->find('first', array ('conditions' => "`category`.`url` = '" . $categoryUrl . "'"));
	   	  if ($objCategory->id || $this->arrRequest[0] == 'no_category') { // Если есть такая категория или указано nocategory
	   	  	if(!$this->arrRequest[1] && $this->arrRequest[0] != 'no_category') {// Если после категории больше в url ничего не прописано и не указано nocategory
	      		// Выводим страницу конкретной категории
	      		$controller = new Controller_Category($this->arrRequest);
	        	$controller->actionOne($objCategory);
	        	exit();
	      	}
	      	if($this->arrRequest[1] == 'articles' && !$this->arrRequest[2]) { // Страница статей конкретной категории
	      		if(isset($_GET['page'])) $pageNumber = $_GET['page']; // Записываем номер страницы, которую нужно показать
				else $pageNumber = 1; // По умолчанию выводим первую страницу
				
				$objArticle = new Article();
				// Считаем количество страниц для текущей навигации и проверяем корректность данных из GET
				if ($objCategory->id) $essenceCount = $objArticle->find('first', array('select' => 'count(`article`.`ID_article`) as count','conditions' => "`article`.`ID_category`='" . $objCategory->id . "'"));
				else $essenceCount = $objArticle->find('first', array('select' => 'count(`article`.`ID_article`) as count','conditions' => '`article`.`ID_category` IS NULL'));
				$pagesNumber = ceil($essenceCount['count'] / $objArticle->essenceNumberOnPage); // Необходимое количество страниц для навигации
				// Если GET пуст или в нём указан правильный номер страницы
				if(!$_GET || ($pageNumber <= $pagesNumber && preg_match("/^[1-9]{1}[\d]*$/",$pageNumber))) {
	      			$controller = new Controller_Article($this->arrRequest);
	      			// Выводим страницу статей конкретной категории
	      			$controller->actionList($objArticle,$objCategory,$pagesNumber,$pageNumber);
	      			exit();
				}
	      	}
	      	
	      	if($this->arrRequest[1] == 'questions' && !$this->arrRequest[2]) { // Страница вопрос конкретной категории
	      		if(isset($_GET['page'])) $pageNumber = $_GET['page']; // Записываем номер страницы, которую нужно показать
	      		else $pageNumber = 1; // По умолчанию выводим первую страницу
	      	
	      		$objQuestion = new Question();
	      		// Считаем количество страниц для текущей навигации и проверяем корректность данных из GET
	      		if ($objCategory->id) $essenceCount = $objQuestion->find('first', array('select' => 'count(`question`.`ID_question`) as count','conditions' => "`question`.`ID_category`='" . $objCategory->id . "'"));
	      		else $essenceCount = $objQuestion->find('first', array('select' => 'count(`question`.`ID_question`) as count','conditions' => '`question`.`ID_category` IS NULL'));
	      		$pagesNumber = ceil($essenceCount['count'] / $objQuestion->essenceNumberOnPage); // Необходимое количество страниц для навигации
	      		// Если GET пуст или в нём указан правильный номер страницы
	      		if(!$_GET || ($pageNumber <= $pagesNumber && preg_match("/^[1-9]{1}[\d]*$/",$pageNumber))) {
	      			$controller = new Controller_Question($this->arrRequest);
	      			// Выводим страницу вопросов конкретной категории
	      			$controller->actionList($objQuestion,$objCategory,$pagesNumber,$pageNumber, $essenceCount['count']);
	      			exit();
	      		}
	      	}
	      	
	      	$articleUrl = Service_Escape::absolutelyEscapeString($this->arrRequest[2]);
	      	if ($this->arrRequest[1] == 'articles' && !$this->arrRequest[3]) {
	      		$objArticle = new Article();
	      		$objArticle->find('first', array ('conditions' => "(`article`.`ID_category` ='" . $objCategory->id  ."' OR `article`.`ID_category` IS NULL)  AND `url` = '" . $articleUrl . "'" ));
	      		if ($objArticle->id) {
	      			// Вывобим страницу конкретной статьи
	      			$controller = new Controller_Article($this->arrRequest[1]);
	      			$controller->actionShowOne($objArticle,$objCategory);
	      			exit();
	      		}
	   	  	}
	   	  }
	      
	      
	  }

	  // Проверяем на открытие статьи
	  
	  
	  
	  
	  $this->setError(404);
	}
	
	/**
	 * Выводит страницу статьи
	 * 
	 * @param Article $objArticle
	 */
	public function actionArticle(Article $objArticle) {
		Service_Debug::setDebug();
		$objData = new Data(isset($_POST['Data']) ? Service_Escape::absolutelyEscapeArray($_POST['Data']) : null);
		if (isset($_POST['Data'])) $this->processForm($objArticle->getField('url'), $objData);
		else {
			switch ($objArticle->getField('url')) {
				case 'cancellation.htm':
					$objData->setField('id', Service_Escape::requestDataInt('id', 'GET', ''));
					$objData->setField('e_mail', Service_Escape::requestDataString('e_mail', 'GET', ''));
					$this->addCss('cancellation.css');
					break;
				case 'wm_request.htm':
					$bookingId = Service_Escape::requestDataInt('ID_booking', 'GET', '');
					$objBooking = new Booking($bookingId);
					if ($objBooking->id && $objBooking->getField('other_payment_type') == 'WebMoney') {
						$objData->setField('LMI_PAYMENT_NO', $bookingId);
						$objData->setField('LMI_PAYMENT_AMOUNT', $objBooking->getBookingPrice('RUB') * 1.04);						
					}
					else User_Session::moveTo(W_ABSPATH . 'wm_pay.htm');
					break;				
			}
		}
    $language = Service_Translate::getLang();
    $this->addJsForForms($objArticle->getField('url'));
		$this->title = $objArticle->getField('title_' . $language);
    $this->description = $objArticle->getField('description_' . $language);
    $this->keywords = $objArticle->getField('keywords_' . $language);
    $this->pageHead = $objArticle->getField('article_name_' . $language);
    if (SimpleAdministration::isAdmin()) $this->editUrl = W_ADMIN . 'articles/edit/' . $objArticle->id . '/';
    $objViewArticle = new View_Article();
  
    $this->addAutosuggestMetas();
    $this->showHeader();
      echo '<div id="article">';
        echo $objArticle->getField('text_' . $language);
      echo '</div>';
      $objViewArticle->showArticleForms($objArticle->getField('url'), $objData);
    $this->showFooter();
	}
	
	/**
	 * Добавляем JS для форм
	 * 
	 * @param $url - URL страницы
	 */
	public function addJsForForms($url) {
		Service_Debug::setDebug();
			switch ($url) {
			case 'group_form.htm': 
				/*$this->addJs('plugins/calendar2011_rus.js');
				$this->addJsReady("
margin = 5;				
calendar.makeDates();
calendar.set(startArr, calendarEnd, actualArr, 'Data_date_arr', 'arrDateFunction', message_1, message_2, message_3, 'errorClass');
calendar.set(startDep, calendarEnd, actualDep, 'Data_date_dep', 'depDateFunction', message_1, message_2, message_3, 'errorClass');
				");		*/						
				break;
		}		
	}
	
	/**
	 * Осущеcтвляем обработку форм
	 * 
	 * @param $url - URL страницы
	 * @param Data $objData - Объект формы
	 */	
	public function processForm($url, Data $objData){
		Service_Debug::setDebug();
			switch ($url) {
			case 'group_form.htm': $this->processGroupForm($objData); break;
			case 'cancellation.htm': $this->processCancellationForm($objData); break;
			case 'send_form.htm': $this->processFeedbackForm($objData); break;
			case 'offertohotels_form.htm': $this->processOffertHotelForm($objData); break;
			case 'wm_pay.htm': $this->processWMPayForm($objData); break;
		}		
	}	
	
	/**
	 * Осущеcтвляем обработку формы группового бронирования
	 * 
	 * @param Data $objData - Объект формы
	 */	
	public function processGroupForm(Data $objData){
		Service_Debug::setDebug();
		$objData->validatesFormatOf = array(
			//'date_arr' => array('message' => 'Дата заезда введена неверно', 'with' => '/([0-2]\d|3[01])\/(0\d|1[012])\/(\d{4})/'),
			//'date_dep' => array('message' => 'Дата выезда введена неверно', 'with' => '/([0-2]\d|3[01])\/(0\d|1[012])\/(\d{4})/'),
		);
	  $objData->validatesLengthOf = array(
		  'first_name' => array('minimum' => 2, 'maximum' => 128, 'message' => 'Имя должно состоять из 2-128 символов'),
	  	'last_name' => array('minimum' => 2, 'maximum' => 128, 'message' => 'Фамилия должна состоять из 2-128 символов'),
		  'country' => array('minimum' => 2, 'maximum' => 128, 'message' => 'Страна должна состоять из 2-128 символов'),
	  	'city' => array('minimum' => 2, 'maximum' => 128, 'message' => 'Город должен состоять из 2-128 символов'),  
	  	'date_arr' => array('minimum' => 5, 'maximum' => 128, 'message' => 'Дата заезда указана неверно'),  
	  	'date_dep' => array('minimum' => 5, 'maximum' => 128, 'message' => 'Дата выезда указана неверно'),  
	  );	
	  $objData->validatesPresenceOf = array(
	  	'payment' => array('message' => 'Не выбрана форма оплаты'),
	  );	  
	  $objData->fullValidation();
		if (!Exception_ActiveRecord::getExceptionsOfModel('Data')) {
			unset($objData->tableFields['save']);
			$objNotification = new User_Notification();
			$objNotification->groupBooking($objData->tableFields);		
		}		  	  
	}		
	
	/**
	 * Осущеcтвляем обработку формы отмены бронирования
	 * 
	 * @param Data $objData - Объект формы
	 */	
	public function processCancellationForm(Data $objData){
		Service_Debug::setDebug();
	  $objData->validatesLengthOf = array(
		  'id' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('Номер маршрута')),
	  	'pincode' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('PIN-код для отмены заказа')),
	  );	
	  $objData->validatesFormatOf = array(
	    'e_mail' => array('message' => Service_Translate::getText('E-Mail введен неверно'), 'with' => "/^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$/"),
	  );	  
	  $objData->fullValidation();
		if (!Exception_ActiveRecord::getExceptionsOfModel('Data')) {
			$objBooking = new Booking();
			$objBooking->find('first', array('conditions' => "id = '" . $objData->getField('id') . "'"));
			if ($objBooking->id) {

				if ($objBooking->getField('pincode') == $objData->getField('pincode')) {
					$objServiceBooking = new Service_Booking();
					if ($objBooking->getField('payment_type') == 'credit_card') $arrResult = $objServiceBooking->cancelBooking($objBooking->getField('id'), $objBooking->getField('pincode'));
					else $arrResult = array('result' => 'our');
					if (isset($arrResult['fault'])) {
						if ($arrResult['fault']['string'] == 'bookings.cancelBooking: this booking is already cancelled') Exception_ActiveRecord::addObjectException('Data', 'error', Service_Translate::getText('Заказ уже отменен')); 	
						else Exception_ActiveRecord::addObjectException('Data', 'error', Service_Translate::getText('Невозможно отменить заказ'));					
					}
					else { // Все отлично сработало
						$objBooking->updateField('is_cancelled', 1);
						$objBooking->updateField('cancel_comment', $objData->getField('cancel_comment'));
					}
				}
				else Exception_ActiveRecord::addObjectException('Data', 'error', Service_Translate::getText('Неверно введен PIN'));
			}
			else Exception_ActiveRecord::addObjectException('Data', 'error', Service_Translate::getText('Не существует заказа с таким ID'));
		}		  	  
	}		
	
	/**
	 * Осущеcтвляем обработку формы обратной связи
	 * 
	 * @param Data $objData - Объект формы
	 */	
	public function processFeedbackForm(Data $objData){
		Service_Debug::setDebug();
		$objData->validatesLengthOf = array(
		  'first_name' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('Имя')),
			'comment' => array('minimum' => 2, 'maximum' => 4096, 'fieldName' => Service_Translate::getText('Комментарий')),
	  );
	  $objData->validatesFormatOf = array(
	    'e_mail' => array('message' => Service_Translate::getText('E-Mail введен неверно'), 'with' => "/^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$/"),
	  );	  
	  $objData->fullValidation();
		if (!Exception_ActiveRecord::getExceptionsOfModel('Data')) {
			unset($objData->tableFields['save']);
			$objNotification = new User_Notification();
			$objNotification->feedback($objData->tableFields);		
		}		  	  
	}
	/**
	 * Осущеcтвляем обработку формы оплаты по WebMoney
	 * 
	 * @param Data $objData - Объект формы
	 */	
	public function processWMPayForm(Data $objData){
		Service_Debug::setDebug();
		$objData->validatesLengthOf = array(
		  'ID_booking' => array('minimum' => 1, 'maximum' => 12, 'fieldName' => Service_Translate::getText('Введите номер платежа'))
	  );
	  $objData->validatesFormatOf = array(
	    'ID_booking' => array('message' => Service_Translate::getText('Неверный номер платежа'), 'with' => "/^[0-9]+$/"),
	  );	  	  
	  $objData->fullValidation();
		if (!Exception_ActiveRecord::getExceptionsOfModel('Data')) {
			$objBooking = new Booking($objData->getField('ID_booking'));
			if (!$objBooking->id || $objBooking->getField('other_payment_type') != 'WebMoney') Exception_ActiveRecord::addObjectException('Data', 'ID_booking', Service_Translate::getText('Неверный номер платежа'));
			else {
				User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH . 'wm_request.htm?ID_booking=' . $objBooking->id));
			}
		}		  	  
	}
	
	/**
	 * Осущеcтвляем обработку формы сотрудничества
	 * 
	 * @param Data $objData - Объект формы
	 */	
	public function processOffertHotelForm(Data $objData){
		Service_Debug::setDebug();
		$objData->validatesLengthOf = array(
		  'hotel_name' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('Название гостиницы')),
		  'class' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('Категория')),
		  'room_amount' => array('minimum' => 2, 'maximum' => 10, 'fieldName' => Service_Translate::getText('Количество номеров')),
		  'address' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('Адрес')),
		  'city' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('Город')),
		  'zip' => array('minimum' => 2, 'maximum' => 10, 'fieldName' => Service_Translate::getText('Почтовый индекс')),
		  'country' => array('minimum' => 2, 'maximum' => 64, 'fieldName' => Service_Translate::getText('Страна')),
		  'phone' => array('minimum' => 2, 'maximum' => 24, 'fieldName' => Service_Translate::getText('Телефон')),
		  'fax' => array('minimum' => 2, 'maximum' => 24, 'fieldName' => Service_Translate::getText('Факс')),
		  'contact_person' => array('minimum' => 2, 'maximum' => 128, 'fieldName' => Service_Translate::getText('Контактное лицо')),
	  );
	  $objData->validatesFormatOf = array(
	    'e_mail' => array('allowNull' => true, 'message' => Service_Translate::getText('E-Mail введен неверно'), 'with' => "/^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$/"),
	  );	  
	  $objData->fullValidation();
		if (!Exception_ActiveRecord::getExceptionsOfModel('Data')) {
			unset($objData->tableFields['save']);
			$objNotification = new User_Notification();
			$objNotification->offertHotel($objData->tableFields);
			$objOurHotel = new OurHotel();
			//$objOurHotel->addHotelOffer($objData->tableFields);		
			User_Session::moveTo(View_Base::getLanguageUrl(W_ABSPATH . 'offertohotels_form.htm'), Service_Translate::getText('Заявка успешно отправлена'), 1);
		}		  	  
	}

  /**
   * Выводит левую часть
   *
   */
  public function showLeft() {
  	Service_Debug::setDebug();
  	$objCity = new City();
  	$objViewBlock = new View_Block();
  	echo '<div id="left">';
      $objViewBlock->showOpenSimplestBorderBlock(Service_Translate::getText('Новый поиск'), array('alignCenter' => false, 'id' => 'mainNewSearch', 'class' => 'mainSearchForm'));
	      $objViewBlock->showHotelSearch($objCity);
	    $objViewBlock->showCloseSimplestBorderBlock();
	    if ($this->arrRequest[0] == 'conference.htm' || $this->arrRequest[0] == 'corporateevents.htm' || $this->arrRequest[0] == 'corporate_service.htm' || $this->arrRequest[0] == 'businesstrips.htm') {
	    	$objViewBlock->showTopClientBanner();
	    }
  	echo '</div>';
  }
	
}